package DAO;

/**
 *
 * @author ebastos
 */
import static Conexao.ConexaoBancoDeDados.getConexao;
import Model.BeanConserto;
import Util.Util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

public class DAOConserto {

    public DAOConserto() {
    }

    private BeanConserto GetConserto(ResultSet rs) throws SQLException {
        try {
            if (rs.first()) {
                BeanConserto conserto = new BeanConserto();
                conserto.setCLIENTECPF(rs.getLong("CLIENTECPF"));
                conserto.setDataConserto(rs.getDate("dataConserto"));
                if (rs.wasNull()) {
                    conserto.setDataConserto(Util.DataNula);
                }
                conserto.setDataEntrada(rs.getDate("dataEntrada"));
                conserto.setDataPrevSaida(rs.getDate("dataPrevSaida"));
                conserto.setDataRetirada(rs.getDate("dataRetirada"));
                if (rs.wasNull()) {
                    conserto.setDataRetirada(Util.DataNula);
                }
                conserto.setDescricaoProbCliente(rs.getString("descricaoProbCliente"));
                conserto.setDescricaoSolucao(rs.getString("descricaoSolucao"));
                conserto.setID(rs.getInt("ID"));
                conserto.setMATRICULA(rs.getInt("MATRICULA"));
                conserto.setPRODUTOID(rs.getInt("PRODUTOID"));
                conserto.setValor(rs.getFloat("valor"));
                return conserto;
            } else {
                //Não retornou nenhuma linha
                return null;
            }
        } catch (SQLException e) {
            throw e;
        }
    }

    private ArrayList<BeanConserto> GetConsertos(ResultSet rs) throws SQLException {
        try {
            if (rs.first()) {
                ArrayList<BeanConserto> retorno = new ArrayList<>();
                BeanConserto conserto = new BeanConserto();
                conserto.setCLIENTECPF(rs.getLong("CLIENTECPF"));
                conserto.setDataConserto(rs.getDate("dataConserto"));
                if (rs.wasNull()) {
                    conserto.setDataConserto(Util.DataNula);
                }
                conserto.setDataEntrada(rs.getDate("dataEntrada"));
                conserto.setDataPrevSaida(rs.getDate("dataPrevSaida"));
                conserto.setDataRetirada(rs.getDate("dataRetirada"));
                if (rs.wasNull()) {
                    conserto.setDataRetirada(Util.DataNula);
                }
                conserto.setDescricaoProbCliente(rs.getString("descricaoProbCliente"));
                conserto.setDescricaoSolucao(rs.getString("descricaoSolucao"));
                conserto.setID(rs.getInt("ID"));
                conserto.setMATRICULA(rs.getInt("MATRICULA"));
                conserto.setPRODUTOID(rs.getInt("PRODUTOID"));
                conserto.setValor(rs.getFloat("valor"));
                retorno.add(conserto);
                while (rs.next()) {
                    conserto = new BeanConserto();
                    conserto.setCLIENTECPF(rs.getLong("CLIENTECPF"));
                    conserto.setDataConserto(rs.getDate("dataConserto"));
                    if (rs.wasNull()) {
                        conserto.setDataConserto(Util.DataNula);
                    }
                    conserto.setDataEntrada(rs.getDate("dataEntrada"));
                    conserto.setDataPrevSaida(rs.getDate("dataPrevSaida"));
                    conserto.setDataRetirada(rs.getDate("dataRetirada"));
                    if (rs.wasNull()) {
                        conserto.setDataRetirada(Util.DataNula);
                    }
                    conserto.setDescricaoProbCliente(rs.getString("descricaoProbCliente"));
                    conserto.setDescricaoSolucao(rs.getString("descricaoSolucao"));
                    conserto.setID(rs.getInt("ID"));
                    conserto.setMATRICULA(rs.getInt("MATRICULA"));
                    conserto.setPRODUTOID(rs.getInt("PRODUTOID"));
                    conserto.setValor(rs.getFloat("valor"));
                    retorno.add(conserto);
                }
                return retorno;
            } else {
                //Não retornou nenhuma linha
                return null;
            }
        } catch (SQLException e) {
            throw e;
        }
    }

    public BeanConserto RetornaConserto(int ID) throws SQLException {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "SELECT * FROM conserto WHERE ID = ?";
            PreparedStatement ps = conn.prepareStatement(sql);

            ps.setString(1, String.valueOf(ID));
            ResultSet rs = ps.executeQuery();
            return GetConserto(rs);
        } catch (SQLException e) {
            throw e;
        }
    }

    public ArrayList<BeanConserto> RetornaConsertos() throws SQLException {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "SELECT * FROM conserto";

            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            return GetConsertos(rs);
        } catch (SQLException e) {
            throw e;
        }
    }

    public ArrayList<BeanConserto> RetornaConsertos(Date dtIniAbertura, Date dtFimAbertura, String produto, String cliente, boolean atrasado, boolean aberto, boolean fechado) throws SQLException {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "SELECT * "
                    + "FROM conserto con "
                    + "INNER JOIN produto pro ON pro.ID = con.PRODUTOID "
                    + "INNER JOIN pessoa pes ON pes.CPF = con.CLIENTECPF "
                    + "WHERE con.dataEntrada BETWEEN ? AND ? "
                    + "AND pro.descricao LIKE ? "
                    + "AND pes.nome LIKE ? "
                    + "AND con.dataRetirada IS NULL ";
            if (atrasado) {
                sql = sql + "AND con.dataPrevSaida < NOW() AND con.dataConserto IS NULL ";
            }
            if (aberto) {
                sql = sql + "AND con.dataConserto IS NULL ";
            }
            if (fechado) {
                sql = sql + "AND con.dataConserto IS NOT NULL ";
            }
            sql = sql + " ORDER BY con.dataEntrada, con.ID";
            sql = sql + ";";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setDate(1, new java.sql.Date(dtIniAbertura.getTime()));
            ps.setDate(2, new java.sql.Date(dtFimAbertura.getTime()));
            ps.setString(3, "%" + produto + "%");
            ps.setString(4, "%" + cliente + "%");

            ResultSet rs = ps.executeQuery();
            return GetConsertos(rs);
        } catch (SQLException e) {
            throw e;
        }
    }

    public void Atualizar(BeanConserto conserto) throws SQLException {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "UPDATE conserto "
                    + "SET CLIENTECPF = ?, "
                    + "dataConserto = ?, "
                    + "dataEntrada = ?, "
                    + "dataPrevSaida = ?, "
                    + "dataRetirada = ?, "
                    + "descricaoProbCliente = ?, "
                    + "descricaoSolucao = ?, "
                    + "MATRICULA = ?, "
                    + "PRODUTOID = ?, "
                    + "valor = ? "
                    + "WHERE ID = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setLong(1, conserto.getCLIENTECPF());
            ps.setDate(2, conserto.getDataConserto() == Util.DataNula ? null : new java.sql.Date(conserto.getDataConserto().getTime()));
            ps.setDate(3, new java.sql.Date(conserto.getDataEntrada().getTime()));
            ps.setDate(4, new java.sql.Date(conserto.getDataPrevSaida().getTime()));
            ps.setDate(5, conserto.getDataRetirada() == Util.DataNula ? null : new java.sql.Date(conserto.getDataRetirada().getTime()));
            ps.setString(6, conserto.getDescricaoProbCliente());
            ps.setString(7, conserto.getDescricaoSolucao() == null || conserto.getDescricaoSolucao().isEmpty() ? null : conserto.getDescricaoSolucao());
            ps.setInt(8, conserto.getMATRICULA());
            ps.setInt(9, conserto.getPRODUTOID());
            ps.setFloat(10, conserto.getValor());
            ps.setInt(11, conserto.getID());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw e;
        }
    }

    public void Inserir(BeanConserto conserto) throws SQLException {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "INSERT INTO conserto "
                    + "(CLIENTECPF, "
                    + "dataConserto, "
                    + "dataEntrada, "
                    + "dataPrevSaida, "
                    + "dataRetirada, "
                    + "descricaoProbCliente, "
                    + "descricaoSolucao, "
                    + "PRODUTOID, "
                    + "MATRICULA, "
                    + "valor) "
                    + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setLong(1, conserto.getCLIENTECPF());
            ps.setDate(2, conserto.getDataConserto() == Util.DataNula ? null : new java.sql.Date(conserto.getDataConserto().getTime()));
            ps.setDate(3, new java.sql.Date(conserto.getDataEntrada().getTime()));
            ps.setDate(4, new java.sql.Date(conserto.getDataPrevSaida().getTime()));
            ps.setDate(5, conserto.getDataRetirada() == Util.DataNula ? null : new java.sql.Date(conserto.getDataRetirada().getTime()));
            ps.setString(6, conserto.getDescricaoProbCliente());
            ps.setString(7, conserto.getDescricaoSolucao() == null || conserto.getDescricaoSolucao().isEmpty() ? null : conserto.getDescricaoSolucao());
            ps.setInt(8, conserto.getPRODUTOID());
            ps.setInt(9, conserto.getMATRICULA());
            ps.setFloat(10, conserto.getValor());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw e;
        }
    }
}
